// src/utils/eventBus.js
import { reactive } from 'vue'

const eventBus = reactive({
  currentLayer: '',
  // 当前图层状态
  currentLayer: '',
  // 当前深度状态（新增）
  currentDepth: 2,
  // 当前时间状态（新增）
  selectedDate: '2025-03-19T00:00:00',
  depthSensitiveLayers: [19, 20, 21, 22, 9,10], // 温度、温度深度、盐度、盐度深度、海流  
  defaultLayerColors: {
    19: ["#0D4D4B", "#217A7A", "#35A69C", "#4BC2BF", "#64E9EE", "#B2D882", "#FFCC00", "#FFAE00", "#FF9900", "#FF0000"], // 温度
    20: ["#0D4D4B", "#217A7A", "#35A69C", "#4BC2BF", "#64E9EE", "#B2D882", "#FFCC00", "#FFAE00", "#FF9900", "#FF0000"], // 温度深度
    21: ["#0D4D4B", "#35A69C", "#64E9EE", "#FFCC00"], // 盐度
    22: ["#0D4D4B", "#35A69C", "#64E9EE", "#FFCC00"], // 盐度深度
    9: ["#3498DB", "#5DADE2", "#76D7C4", "#F4D03F", "#F39C12"], // 海流强度
    23: ["#0D4D4B", "#217A7A", "#35A69C", "#4BC2BF", "#64E9EE", "#B2D882", "#FFCC00", "#FFAE00", "#FF9900", "#FF0000"], // 潮位
    13: ["#0D4D4B", "#217A7A", "#35A69C", "#4BC2BF", "#64E9EE", "#B2D882", "#FFCC00", "#FFAE00", "#FF9900", "#FF0000"], // 海表面高度
    15: ["#4BC2BF", "#64E9EE", "#B2D882", "#FFCC00", "#FFAE00", "#FF9900", "#FF0000"] // 锋面强度
  },
  layerDescriptions: {
    temperature:`数值模拟系统采用FVCOM非均匀网格；
    空间分辨率平均为1000米，最小分辨率为100米；
    时间分辨率平均为3小时；
    垂向分为不等间隔的60层。
    数值模拟系统采用FVCOM非均匀网格`,
    salinity:`数值模拟系统采用FVCOM非均匀网格；
    空间分辨率平均为1000米，最小分辨率为100米；
    时间分辨率平均为3小时；
    垂向分为不等间隔的60层。
    数值模拟系统采用FVCOM非均匀网格`,
    current:`数值模拟系统采用FVCOM非均匀网格；
    空间分辨率平均为1000米，最小分辨率为100米；
    时间分辨率平均为3小时；
    垂向分为不等间隔的60层。
    数值模拟系统采用FVCOM非均匀网格`,
    chao:`点击对应潮站即可展示潮站的历史数据；
    数值模拟系统采用FVCOM非均匀网格；
    空间分辨率平均为1000米，最小分辨率为100米；
    时间分辨率平均为3小时；
    数值模拟系统采用FVCOM非均匀网格`,
    yueceng: '点击浮标或潜标，弹窗显示跃层；跃层判别方法：跃层参数的确定采用最大角度法(Chu and Fan, 2011)，该方法基于跃层上、下界的梯度巨变特征，具有较强的理论基础。由剖面数据计算跃层上界深度、下界深度和跃层强度，主要通过向量拟合，找最大夹角的方式加以确定：沿观测剖面，自上而下，每两个相邻观测深度的数据确定一个拟合向量（指向下方）；为避免角度求解带来的不便，以正切值代替角度大小，进而逐个计算相邻两个拟合向量夹角的正切值。夹角正切最大值对应的深度即为跃层上界深度，而夹角正切最小值对应的深度即为跃层下界深度，同时记录对应深度的温度（或密度）。跃层强度通过温度跃层（或密度跃层）的垂直梯度来表征，即在确定了跃层上、下界深度之后，由跃层上、下界温度（或密度）之差除以跃层厚度来计算跃层强度。盐度跃层的判别方法：计算盐度资料的垂向梯度，当梯度值大于或等于0.01/m时，该水层被判定为盐度跃层。',
    eddy: '点击气旋涡或反气旋涡，弹窗显示涡旋信息；中尺度涡判别方法：涡旋特征参数的识别，采用流矢量方法(Nencioli et al, 2010 )，该方法以满足以下条件来定义涡旋中心：首先，拟定涡旋中心的东-西、南-北方向速度分量Uy和Ux在其两侧符号相反，且流速大小均随距中心点的距离的增加而线性增加；其次，在选定区域内速度最小值的位置被近似认定为涡旋中心，同时，涡旋中心附近速度矢量的旋转方向需保持一致。涡旋中心确定后，通过计算流函数确定最大闭合流函数线，以此作为涡旋边界。随后进行涡旋轨迹追踪：若在时间t探测到某个涡旋，则下一时刻（t+1）在平均半径内寻找最近距离的同类型涡旋；如未找到，则在t+2时刻，扩大至1.5倍平均半径继续寻找；若依旧未找到，则认为该涡旋消亡。',
    fengmian: '锋面判别方法：锋区范围检测采用温度梯度法，该方法是目前锋面检测方法中较为成熟的方法：首先，采用前差差分法计算温度梯度；其次选取0.03℃/km 阈值作为温度锋面的判断标准；最后，进行图像二值化，确定锋区范围。同时，锋面中心线提取采用基于梯度的二维图像边缘检测算法：该方法首先通过获取 SST梯度的方向及大于锋面阈值的格点数据，再经由 Canny 算子找出这些格点数据中邻近区域里具有相同梯度方向的最大梯度值所在位置，通过依次相连这些最大梯度值所在的格点，得到温度锋的中心线。',
    neibo:'点击内波波峰线，显示内波温度剖面以及内波3D效果图；内波介绍:海洋内波是一种发生在密度稳定层化海水中、最大振幅出现在跃层附近的波动现象，是海洋内部广泛存在的一种动力过程。内波的存在会引起海洋要素（温/盐/密）的垂直分布不均匀性，进而在垂直方向上存在明显的深度结构。内波的三维空间波动特性对于揭示其水体结构及其变化特征具有重要意义，它能够直观、全面及动态地表现内波的时空特征（波长、振幅、传播方向和波速等）和变化规律。内波识别方法:基于每日连续的合成孔径雷达(SAR)图像，通过目视检查SAR图像，根据图像中表现为明暗相间的条纹，识别出内波的波峰线。接着将标记的波峰线位置从图像坐标系转换为地理坐标系并记录下经纬度达到内波识别的目的。',
    default: '请从左侧图层管理器中选择一个图层，此处将显示对应的判别方法说明。'
  },
  layerDescription2 :{
    temperature: `  （1）温度、盐度、海流、潮位为模式预报结果
  （2）时间覆盖范围：2025/01/08-2025/01/16、2025/03/19-2025/03/23
  （3）时间分辨率：3小时（4）垂向分层：60层（5）重要潮站共12个，起止时间：2025/01/08-2025/01/16`,
    salinity: `  （1）温度、盐度、海流、潮位为模式预报结果
    （2）时间覆盖范围：2025/01/08-2025/01/16、2025/03/19-2025/03/23
    （3）时间分辨率：3小时（4）垂向分层：60层（5）重要潮站共12个，起止时间：2025/01/08-2025/01/16`,
    current: `  （1）温度、盐度、海流、潮位为模式预报结果
    （2）时间覆盖范围：2025/01/08-2025/01/16、2025/03/19-2025/03/23
    （3）时间分辨率：3小时（4）垂向分层：60层（5）重要潮站共12个，起止时间：2025/01/08-2025/01/16`,
    chao:`  （1）温度、盐度、海流、潮位为模式预报结果
    （2）时间覆盖范围：2025/01/08-2025/01/16、2025/03/19-2025/03/23
    （3）时间分辨率：3小时（4）垂向分层：60层（5）重要潮站共12个，起止时间：2025/01/08-2025/01/16`,
    eddy:"中尺度涡、锋面、内波的时间覆盖范围：2023/01/01-2025/03/31，时间分辨率：每天。其中，内波反演受云量影响，建议选择每年的6-8月份",
    yueceng:`  （1）Argo跃层的时间覆盖范围：2022/01-2024/12，时间分辨率：每月'
    （2）潜标01观测时间为2022.01.01-01.31
    （3）潜标02观测时间为2022.02.01-02.28`,
    fengmian:'中尺度涡、锋面、内波的时间覆盖范围：2023/01/01-2025/03/31，时间分辨率：每天。其中，内波反演受云量影响，建议选择每年的6-8月份',
    neibo:'中尺度涡、锋面、内波的时间覆盖范围：2023/01/01-2025/03/31，时间分辨率：每天。其中，内波反演受云量影响，建议选择每年的6-8月份',
    default: '请从左侧图层管理器中选择一个图层，此处将显示对应的数据时间范围。'
    },
  // 事件系统（优化版）
  _events: {},
  // 当前颜色配置
  layerColors: {},
  
  // 初始化颜色配置
  initLayerColors() {
    this.layerColors = JSON.parse(JSON.stringify(this.defaultLayerColors));
  },
  
  // 获取图层颜色配置
  getLayerColors(layerId) {
    return this.layerColors[layerId] || this.defaultLayerColors[layerId];
  },
  
  // 更新图层颜色配置
  updateLayerColors(layerId, colors) {
    this.layerColors[layerId] = colors;
    this.$emit('color-config-change', { layerId, colors });
  },
  
  // 重置图层颜色配置
  resetLayerColors(layerId) {
    if (this.defaultLayerColors[layerId]) {
      this.layerColors[layerId] = [...this.defaultLayerColors[layerId]];
      this.$emit('color-config-change', { 
        layerId, 
        colors: this.defaultLayerColors[layerId] 
      });
    }
  },
  // 事件监听
  $on(event, callback) {
    if (!this._events[event]) this._events[event] = []
    this._events[event].push(callback)
  },
  
  // 取消监听
  $off(event, callback) {
    if (!this._events[event]) return
    if (!callback) {
      // 如果没有提供回调，移除该事件的所有监听
      delete this._events[event]
      return
    }
    const index = this._events[event].indexOf(callback)
    if (index > -1) this._events[event].splice(index, 1)
  },
  // 设置深度
  setCurrentDepth(depth) {
    this.currentDepth = depth;
    this.$emit('depth-change', depth);
  },
  
  // 设置日期
  setSelectedDate(date) {
    const formatted = this.formatDateTime(date);
    if (!formatted) return;
    this.selectedDate = formatted;
    this.$emit('time-change', formatted);
  },
  
  formatDateTime(dateString) {
    // 保持原有时间格式化逻辑
    const date = new Date(dateString);
    return `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2,'0')}-${String(date.getDate()).padStart(2,'0')}T${String(date.getHours()).padStart(2,'0')}:00:00`;
  },
  // 触发事件
  $emit(event, ...args) {
    if (!this._events[event]) return
    // 创建副本，防止回调函数内注册新监听器导致无限循环
    const handlers = this._events[event].slice()
    handlers.forEach(callback => {
      try {
        callback(...args)
      } catch (e) {
        console.error(`事件处理错误 [${event}]:`, e)
      }
    })
  },

  // 设置当前图层
  setCurrentLayer(layer) {
    this.currentLayer = layer
    this.$emit('layer-change', layer)
  },
  
  // 设置当前深度（新增）
  setCurrentDepth(depth) {
    this.currentDepth = depth
    this.$emit('depth-change', depth)
  },
  
  // 设置当前日期（新增）
  setSelectedDate(date) {
    this.selectedDate = date
    this.$emit('time-change', date)
  },
  
  // 获取当前图层描述
  getCurrentDescription() {
    return this.layerDescriptions[this.currentLayer] || this.layerDescriptions.default
  },
  getCurrentDescription2() {
    return this.layerDescription2[this.currentLayer] || this.layerDescription2.default
  },
  // 获取当前状态快照（新增）
  getCurrentState() {
    return {
      layer: this.currentLayer,
      depth: this.currentDepth,
      date: this.selectedDate
    }
  }
})
eventBus.initLayerColors();
export default eventBus